
semaphore empty = 3; // 控制甲挖树坑的数量，树坑最多为 3 个
semaphore mutex = 1; // 控制甲和乙互斥使用 1 把铁锹
semaphore sem_甲乙 = 0; // 用户控制甲和乙执行顺序
semaphore sem_乙丙 = 0; // 用户控制乙和丙执行顺序

甲() {
    while (TRUE) {
        P(empty); // 树坑超过 3 个了，甲阻塞
        P(mutex); // 拿到铁锹
        挖坑;
        V(mutex); // 释放铁锹
        V(sem_甲乙); // 通知乙，可以放树苗和填土了
    }
}

乙() {
    while (TRUE) {
        P(sem_甲乙); // 等待甲执行完成
        放树苗;
        P(mutex);   // 拿到铁锹
        填土;
        V(mutex);   // 释放铁锹
        V(empty);   // 树坑的数量减 1，唤醒阻塞的甲
        V(sem_乙丙); // 通知丙，可以浇水了
    }
}

丙() {
    while (TRUE) {
        P(sem_乙丙); // 等待乙执行完成
        浇水;
    }
}